﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace LOGIC
{
    public class LogicInvoice
    {
        private LogicSession session;
        private DB.Faktura invoice;
        public LogicInvoice()
        {
        }

        private LogicInvoice(DB.Faktura invoiceObject)
        {
            this.invoice = invoiceObject;
        }

       
        public LogicInvoice(LogicSession session) 
        {
            this.session = session;
        }
        public List<string> GetInvoices()
        {
            return LogicSession.TheSession.Db.Invoices();
        }

        /// <summary>
        /// Metod som samlar alla bokningsrader som finns kopplade till en bokning i en lista för att lägga till i fakturan.
        /// </summary>
        /// <param name="bookingID"></param>
        /// <returns></returns>
        public List<string> GetWholeInvoice(int bookingID)
        {
            List<string> allInvoices = new List<string>();
            List<string> lodgingBookingRows = LogicSession.TheSession.Db.GetInvoiceLodgingBookingRows(bookingID);
            List<string> bookingRow = LogicSession.TheSession.Db.GetInvoiceBookingRow(bookingID);
            List<string> conferenceBookingRows = LogicSession.TheSession.Db.GetInvoiceConferenceBookingRows(bookingID);
            foreach (var b in bookingRow)
            {
                allInvoices.Add(b);
            }

            foreach (var cb in conferenceBookingRows)
            {
                allInvoices.Add(cb);
            }

            foreach (var lb in lodgingBookingRows)
            {
                allInvoices.Add(lb.ToString());
            }
         
            return allInvoices;
            
        }

        /// <summary>
        /// Metod som skapar en summeringsfaktura som sedan returneras till användaren för att visa info om den
        /// </summary>
        /// <param name="tempID"></param>
        /// <param name="guestNr"></param>
        /// <param name="invoiceType"></param>
        /// <param name="price"></param>
        /// <param name="type"></param>
        /// <param name="staffID"></param>
        /// <returns></returns>
        public static LogicInvoice CreateSumInvoice(int tempID, int guestNr, string invoiceType, int price, string type, int staffID)
        {
            return new LogicInvoice(LogicSession.TheSession.Db.CreateSumInvoice(tempID,guestNr,invoiceType, price,type,staffID)); // Skapar en faktura som sedan returneras till användaren för att visa info om den

        }

        /// <summary>
        /// Skapar en vanlig faktura som sedan returneras till användaren för att visa info om den
        /// </summary>
        /// <param name="bookingID"></param>
        /// <param name="type"></param>
        /// <returns></returns>
        public static LogicInvoice CreateLodgingInvoice(int bookingID, string type)
        { 
            return new LogicInvoice (LogicSession.TheSession.Db.CreateLodgingInvoice(bookingID, type)); // Skapar en faktura som sedan returneras till användaren för att visa info om den
          
        }

        /// <summary>
        /// Metod som hämtar en faktura utifrån bokningsnummer
        /// </summary>
        /// <param name="bookingID"></param>
        /// <returns></returns>
        public List<string> GetInvoice(int bookingID)
        {
            List<string> currentInvoice = LogicSession.TheSession.Db.GetInvoice(bookingID);
            if (currentInvoice == null)
                return null;
            else return currentInvoice.ToList<string>();
        }

        /// <summary>
        /// Metod som kontrollerar om en faktura för gästen som inte skall skrivas ut under dagen finns
        /// </summary>
        /// <param name="guestNr"></param>
        /// <param name="today"></param>
        /// <returns></returns>
        public bool InvoiceExistCheck(int guestNr, DateTime today)
        {
            return LogicSession.TheSession.Db.InvoiceExistCheck(guestNr, today);
        }

        /// <summary>
        /// Metod som sätter utskriftsdatum till ett senare datum än morgondagens (gäller enbart för summeringsfakturor)
        /// </summary>
        /// <param name="guestNr"></param>
        /// <param name="today"></param>
        /// <returns></returns>
        public bool InvoicePrintDateLaterThanBookingDayCheck(int guestNr, DateTime today)
        {
            return LogicSession.TheSession.Db.InvoicePrintDateLaterThanBookingDayCheck(guestNr, today);
        }

        /// <summary>
        /// Metod som hämtar ett bokningsnummer för att lägga till i faktura.
        /// </summary>
        /// <param name="guestNr"></param>
        /// <param name="today"></param>
        /// <returns></returns>
        public int GetBookingIDForInvoice(int guestNr, DateTime today)
        {
            return LogicSession.TheSession.Db.GetBookingIDForInvoice(guestNr, today);
        }

        /// <summary>
        /// Metod som sätter bokningsnummer i faktura till null då bokning tagits bort.
        /// </summary>
        /// <param name="guestNr"></param>
        public static void SetNullBookingIDForInvoice(int guestNr)
        {
            LogicSession.TheSession.Db.SetNullBookingIDForInvoice(guestNr);
        }             

    }
}
